#include <QtGui/QApplication>
#include "mainwindow.h"

#include <QDebug>

#include <QTextCodec>
#include <QFile>
#include <QTextStream>
#include <QTime>
#include <QMessageBox>

#define INIFILEPATH             "/config/launcher.ini"
#define LOGFILEPATH             "/tmp/debug.log"

static QFile logfile;
static QTextStream logout;

static char msgflag[4] = {
    'D',
    'W',
    'E',
    'F'
};

static void initStatusName(void)
{
    MainWindow::statusName[0].append("正在检测");
    MainWindow::statusName[1].append("网线未插");
    MainWindow::statusName[2].append("正常");
    MainWindow::statusName[3].append("等待网络");
    MainWindow::statusName[4].append("串口打开失败");
    MainWindow::statusName[5].append("串口获取错误");
    MainWindow::statusName[6].append("串口转换错误");
}

static void customMessageHandler(QtMsgType type, const char *msg)
{
    if(!logfile.isOpen())
    {
        logfile.open(QIODevice::WriteOnly | QIODevice::Append);
    }
    QString log = QString("[%1]   %2   %3\r\n").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(msgflag[type]).arg(msg);
    logout << log;
    logout.flush();
}

int main(int argc, char *argv[])
{
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

    // TODO：设置日志输出路径
    logfile.setFileName(LOGFILEPATH);

    // TODO：创建日志文件
    if(logfile.open(QIODevice::WriteOnly))
    {
        // TODO：将输出流指向日志文件句柄
        logout.setDevice(&logfile);

        // TODO：重定位QDebug
        qInstallMsgHandler(customMessageHandler);

        // TODO：初始化输入参数
        QApplication a(argc, argv);

        // TODO：构建窗体对象
        MainWindow w;

        // TODO：初始化INI参数
        if(w.initConfig(INIFILEPATH))
        {
            // TODO：初始化信号与槽
            if(w.initConnect())
            {
                // TODO：初始化线程
                int retval = w.initThread();
                if(0 == retval)
                {
                    // TODO：启动线程
                    if(w.startThread())
                    {
                        // TODO：初始化完毕，显示界面
                        initStatusName();
                        w.initWindows();
                        w.setFocus();
                        return a.exec();
                    }
                    else
                    {
                        QMessageBox::critical(NULL, "线程启动", "线程启动失败，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
                    }
                }
                else if(1 == retval)
                {
                    QMessageBox::critical(NULL, "数据库驱动初始化", "数据库驱动初始化错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
                }
                else if(2 == retval)
                {
                    QMessageBox::critical(NULL, "线程初始化", "网络线程初始化错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
                }
                else if(3 == retval)
                {
                    QMessageBox::critical(NULL, "线程初始化", "串口线程初始化错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
                }
            }
            else
            {
                QMessageBox::critical(NULL, "信号集初始化", "信号集初始化错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
            }
        }
        else
        {
            QMessageBox::critical(NULL, "配置文件初始化", "读取配置文件错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
        }
    }
    else
    {
        QMessageBox::critical(NULL, "日志系统初始化", "日志系统初始化错误，请联系设备管理员！", QMessageBox::Yes, QMessageBox::Yes);
    }
    return -1;
}
